package u3dserver.user;

import java.util.List;
import java.util.Map;

import com.jfinal.log.Logger;
import com.jfinal.plugin.activerecord.Record;

import net.sf.json.JSONObject;
import u3dserver.MainServer;
import u3dserver.business.PartBs;
import u3dserver.business.UserBs;
import util.Constants;
import util.DateUtil;
import util.DbUtil;
import util.HttpUtil;
import util.LogUtil;
import util.PropUtil;

public class UserParse {
	private UserServer server = null;
	public UserParse(UserServer server){
		this.server = server;
	}
	
	/**
	 * 解析命令
	 * @param active 动作
	 * @param obj 客户端发来的数据
	 */
	public void parse(int active,JSONObject obj){
		switch (active) {
			case Constants.AVTIVE_TYPE.LOGIN:{//用户登录
				this.login(obj);
			}break;
			case Constants.AVTIVE_TYPE.ROLE_LIST:{//角色列表
				this.roleList(obj);
			}break;
			case Constants.AVTIVE_TYPE.ROLE_ADD:{//添加角色
				this.roleAdd(obj);
			}break;
			case Constants.AVTIVE_TYPE.ROLE_UPDATE:{//更新角色
				this.roleUpdate(obj);
			}break;
			case Constants.AVTIVE_TYPE.ROLE_DELETE:{//删除角色
				this.roleDelete(obj);
			}break;
			case Constants.AVTIVE_TYPE.ITEM_ROLE_PACKAGE:{//角色物品列表
				this.itemRolePackage(obj);
			}break;
			case Constants.AVTIVE_TYPE.ITEM_ROEL_EQUIP:{//角色装备
				this.itemRoleEquip(obj);
			}break;
			case Constants.AVTIVE_TYPE.ITEM_CHANGE:{//物品位置变化
				this.itemChange(obj);
			}break;
			case Constants.AVTIVE_TYPE.ITEM_USER:{//物品位置变化
				this.itemUser(obj);
			}break;
			case Constants.AVTIVE_TYPE.ITEM_USE:{//使用物品
				this.itemUse(obj);
			}break;
			case Constants.AVTIVE_TYPE.SYNC_DATA:{//请求数据同步
				this.syncData(obj);
			}break;
			case Constants.AVTIVE_TYPE.JOIN_GAME:{//加入游戏
				this.joinGame(obj);
			}break;
			case Constants.AVTIVE_TYPE.JOIN_GAME_COMPLETE:{//加入游戏
				this.joinGameComplete(obj);
			}break;
			case Constants.AVTIVE_TYPE.SAVE_TEMP:{//保存临时信息
				this.saveTemp(obj);
			}break;
			case Constants.AVTIVE_TYPE.OUT_GAME:{//退出游戏
				this.outGame(obj);
			}break;
			default:{//数据同步
				this.syncData(obj);
			}break;
		}
	}
	/**
	 * 执行方法前验证
	 * @param obj
	 * @return
	 */
	public boolean before(JSONObject obj){
		if(server.getUserid()==null){//如果用未登录，一切方法都不能执行
			JSONObject msg = new JSONObject();
			msg.put("a", Constants.AVTIVE_TYPE.ALERT);
			msg.put("c", Constants.RESULT_CODE.FAIL);
			msg.put("m", "用户未登录");
			server.sendMsg(msg.toString());
			return false;
		}
		return true;
	}
	/**
	 * 填充sid
	 * @param response
	 * @param request
	 * @return
	 */
	public JSONObject initSessionId(JSONObject response,JSONObject request){
		if(response == null){
			response = new JSONObject();
		}
		response.put("sid", request.get("sid"));
		response.put("a", request.get("a"));
		return response;
	}
	/**
	 * 登录
	 * @param obj {u:用户名，p：密码，a:11}
	 */
	public void login(JSONObject obj){		
		String account = obj.getString("u");
		String password = obj.getString("p");
		//账号认证暂时写在本地用数据查，实际应该通过接口统一管理
		//JSONObject result = HttpUtil.getSimpleHttpresult(PropUtil.getInstance().getValue("api.user.login"), "?account="+account+"&password="+password);
		JSONObject result = UserBs.bs.login(account, password);
		LogUtil.info(this.server.getUserid(), this, "收到数据json"+result.toString());
		JSONObject res = new JSONObject();
		res = this.initSessionId(res, obj);
		if(result.getInt("code")==Constants.RESULT_CODE.SUCCESS){//如果用户登录成功，加入在线用户列表
			server.setUserid(account);
			Map<String,Object> usermap = UserBs.bs.getUserInfo(account, result);
			if(usermap!=null){
				res.put("d", JSONObject.fromObject(usermap));
			}
			res.put("c", Constants.RESULT_CODE.SUCCESS);
			MainServer.instance().addUser(account, server);
		}else{
			res.put("c", result.getInt("code"));
		}
		LogUtil.info(this.server.getUserid(), this, "服务器返回"+res.toString());
		server.sendMsg(res.toString());
	}
	/**
	 * 同步数据，将自己发出的指令同步到给其他用户
	 * @param obj
	 */
	public void syncData(JSONObject obj){
		if(!before(obj)) return;
		MainServer.instance().sendData2Other(obj.toString(),server.getUserid());
	}
	/**
	 * 加入游戏
	 * @param obj
	 */
	public void joinGame(JSONObject obj){
		/**
		 * 1、获取用户的临时信息（血量，坐标，方向），在用户玩游戏的过程中，每半分钟同步一次用户的临时信息，存放在临时表
		 * 2、组装用户的属性信息，装备信息
		 */
		if(!before(obj)) return;
		String id = obj.getString("id");//角色ID
		int roleId = 0;
		try{
			roleId = Integer.parseInt(id);
		}catch(Exception e){
			LogUtil.error(this.server.getUserid(), this, "加入游戏时roleid错误");
		}
		Record role = DbUtil.info(null, PropUtil.getInstance().getValue("sql.role.info"),server.getUserid(),id);
		JSONObject data = this.initSessionId(null, obj);
		//临时信息
		Record temp = DbUtil.info(null, PropUtil.getInstance().getValue("sql.role.temp.info"),server.getUserid(),id);
		//装备信息
		List<Map<String,Object>> equipList = DbUtil.list(null, PropUtil.getInstance().getValue("sql.role.equiplist"),id);
		//用户属性
		Map<String,Object> properties = UserBs.bs.getRoleProperty(roleId);
		//返回账号
		data.put("u", server.getUserid());
		//角色名称
		data.put("name", role.get("player_name"));
		data.put("id", id);
		data.put("temp", temp);
		data.put("equip", equipList);
		data.put("properties", properties);
		LogUtil.info(this.server.getUserid(), this, "加入游戏:"+data.toString());
		MainServer.instance().sendData2Other(data.toString(),this.server.getUserid());//向别人发送我加入了游戏
		server.sendMsg(data.toString());//向自己发送我加入了游戏
		
		//向自己发送服务器上所有游戏数据
		
		this.server.setRoleid(id);
	}
	/**
	 * 加入游戏 完成
	 * @param obj
	 */
	public void joinGameComplete(JSONObject obj){
		if(!before(obj)) return;
		this.server.setIngame(true);
		LogUtil.info(this.server.getUserid(), this, "加入游戏完成");
	}
	/**
	 * 保存临时信息
	 * @param obj
	 */
	public void saveTemp(JSONObject obj){
		if(!before(obj)) return;
		String account = server.getUserid();//账号
		String role_id = obj.getString("role_id");// 角色ID
		String update_time = DateUtil.getNowTime();
		String post_state = obj.getString("post_state");// 位置类型
		String post_x = obj.getString("post_x");// 位置类型
		String post_y = obj.getString("post_y");// 位置类型
		String post_z = obj.getString("post_z");// 位置类型
		String life = obj.getString("life");// 位置类型
		String param1 = obj.getString("param1");// 位置类型
		String param2 = obj.getString("param2");// 位置类型
		String param3 = obj.getString("param3");// 位置类型
		String isdead = obj.getString("isdead");// 位置类型
		String extend = obj.getString("extend");//位置类型		
		Record temp = DbUtil.info(null, PropUtil.getInstance().getValue("sql.role.temp.info"),server.getUserid(),role_id);
		boolean result = false;
		if(temp==null){
			result = DbUtil.update(null, PropUtil.getInstance().getValue("sql.role.temp.insert"),account,role_id,update_time,post_state,post_x,post_y,post_z,life,param1,param2,param3,isdead,extend);
		}else{
			result = DbUtil.update(null, PropUtil.getInstance().getValue("sql.role.temp.update"),update_time,post_state,post_x,post_y,post_z,life,param1,param2,param3,isdead,extend,account,role_id);
		}
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
	}
	/**
	 * 退出游戏
	 * @param obj
	 */
	public void outGame(JSONObject obj){
		if(!before(obj)) return;
		String id = obj.getString("id");//角色ID
		JSONObject data = this.initSessionId(null, obj);
		MainServer.instance().sendData2Other(data.toString(),server.getUserid());
		server.setRoleid(null);
		server.setIngame(false);
	}
	/**
	 * 获取角色列表
	 * @param obj {}
	 * @return {d:数据列表}
	 */
	public void roleList(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.list");
		List<Map<String,Object>> list = DbUtil.list(null, sql,server.getUserid());
		JSONObject data = this.initSessionId(null, obj);
		data.put("d", list);
		server.sendMsg(data.toString());
	}
	/**
	 * 获取角色信息
	 * @param obj {id:角色ID}
	 */
	public void roleInfo(JSONObject obj){
		if(!before(obj)) return;
		JSONObject data = this.initSessionId(null, obj);
		server.sendMsg(data.toString());
	}
	/**
	 * 创建角色
	 * @param obj {nane:角色名称,img:角色头像}
	 * @return {c:错误代码}
	 */
	public void roleAdd(JSONObject obj){
		if(!before(obj)) return;
		String rolename = obj.getString("name");
		String img = obj.getString("img");
		String sql = PropUtil.getInstance().getValue("sql.role.insert");
		String sql_nameExist = PropUtil.getInstance().getValue("sql.role.name.exist ");
		
		boolean result = DbUtil.update(null, sql,server.getUserid(),rolename,img);
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
	}
	/**
	 * 删除角色
	 * @param obj {id:角色ID}
	 * @return {c:错误代码}
	 */
	public void roleDelete(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.delete");
		String id = obj.getString("id");
		boolean result = DbUtil.update(null, sql,id,server.getUserid());
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
	}
	/**
	 * 更新角色名称或图像
	 * @param obj {nane:角色名称,img:角色头像}
	 * @return {c:错误代码}
	 */
	public void roleUpdate(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.update");
		String id = obj.getString("id");
		String rolename = obj.getString("name");
		String img = obj.getString("img");
		boolean result = DbUtil.update(null, sql,rolename,img,id,server.getUserid());
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
	}
	/**
	 * 使用物品
	 * @param obj
	 */
	public void itemUse(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.update");
		String id = obj.getString("id");
		String rolename = obj.getString("name");
		String img = obj.getString("img");
		boolean result = DbUtil.update(null, sql,rolename,img,id);
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
		
	}
	/**
	 * 用户物品列表
	 * @param obj {}
	 * @return {d:数据列表}
	 */
	public void itemUser(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.user.bag.partlist");		
		List<Map<String,Object>> list = DbUtil.list(null, sql,server.getUserid());
		JSONObject data = this.initSessionId(null, obj);
		data.put("d", list);
		server.sendMsg(data.toString());
	}
	
	/**
	 * 获取角色装备
	 * @param obj {id:角色ID}
	 * @return {d:数据列表}
	 */
	public void itemRoleEquip(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.equiplist");
		String id = obj.getString("id");
		List<Map<String,Object>> list = DbUtil.list(null, sql,id);
		PartBs.bs.intPartval(list, Constants.CONS.PART_TYPE_USER);
		JSONObject data = this.initSessionId(null, obj);
		data.put("d", list);
		server.sendMsg(data.toString());
	}
	/**
	 * 获取角色背包
	 * @param obj {}
	 * @return {d:数据列表}
	 */
	public void itemRolePackage(JSONObject obj){
		if(!before(obj)) return;
		String id = obj.getString("id");
		String sql = PropUtil.getInstance().getValue("sql.role.partlist");
		List<Map<String,Object>> list = DbUtil.list(null, sql,id);
		PartBs.bs.intPartval(list, Constants.CONS.PART_TYPE_USER);
		JSONObject data = this.initSessionId(null, obj);
		data.put("d", list);
		server.sendMsg(data.toString());
	}
	/**
	 * 获取角色物品列表
	 * @param obj
	 */
	@Deprecated
	public void itemRole(JSONObject obj){
		if(!before(obj)) return;
		JSONObject data = this.initSessionId(null, obj);
		server.sendMsg(data.toString());
	}
	/**
	 * 改变物品位置
	 * @param obj
	 */
	public void itemChange(JSONObject obj){
		if(!before(obj)) return;
		String sql = PropUtil.getInstance().getValue("sql.role.update");
		String id = obj.getString("id");
		String rolename = obj.getString("name");
		String img = obj.getString("img");
		boolean result = DbUtil.update(null, sql,rolename,img,id);
		JSONObject data = this.initSessionId(null, obj);
		data.put("c", result?Constants.RESULT_CODE.SUCCESS:Constants.RESULT_CODE.FAIL);
		server.sendMsg(data.toString());
	}
	
	
}
